/*
 * Prngd_Server.cpp
 *
 *  Last edited: 21.08.2014
 *  Author: David Noack
 */

#include "Prngd_Server.h"


int Prngd_Server::readParameters(int argc, char** argv)
{

	int code = 0;

	for(int i = 1; i < argc; i++)
	{
		if(strcmp(argv[i], "-o")== 0 || strcmp(argv[i], "-bbs")== 0
			|| strcmp(argv[i], "-fbbs") == 0 || strcmp(argv[i], "-s") == 0){
		} //ignore these for the Server

		//start the com Server with a specific interface
		else if(strcmp(argv[i], "-i") == 0)
		{
			memset(argv[i], 0, strlen(argv[i]));
			i++;
			if(i < argc && strcmp(argv[i], ""))
			{
				if(i < argc && (strcmp(argv[i], "tcp") == 0))
				{
					//bit fuer tcp setzen
					code |= 0x02;
					memset(argv[i], 0, strlen(argv[i]));
				}
				else if(i < argc && (strcmp(argv[i], "udp") == 0))
				{
					//bit fuer udp setzen
					code |= 0x04;
					memset(argv[i], 0, strlen(argv[i]));
				}
				else if(i < argc && (strcmp(argv[i], "uds") == 0))
				{
					code |= 0x08;
					memset(argv[i], 0, strlen(argv[i]));
				}
				else if(i < argc && (strcmp(argv[i], "mq") == 0))
				{
					code |= 0x10;
					memset(argv[i], 0, strlen(argv[i]));
				}
				else if(i < argc && (strcmp(argv[i], "local") == 0))
				{
					//bit fuer local setzen
					code |= 0x01;
					memset(argv[i], 0, strlen(argv[i]));
				}
			}
			else
			{
				//no interface chosen
			}
		}
		// show help
		else if(strcmp(argv[i], "--help") == 0)
		{
			std::cout << "\nAufruf: prngd_server GENERATOR OPTION"
			<< "\nGeneriert eine gewünschte Zahl an Zufallsbits mittels BBS \ns"
			<< "oder eines determinisitschen Zufallszahlengenerators und \n"
			<< "speichert diese binaer in einer Datei bei lokaler Benutzung.\n"
			<< " Kann Anfragen per TCP, UDP, UDS oder MQ entgegen nehmen und\n"
			<< " die generierten Zufallsbits als Antwort senden.\n"
			<< "\n GENERATOR: "
			<< "\n -bbs xxxx \t bevorzugt Blum Blum Shub Generator verwenden und xxxx Zufallsbits generieren. "
			<< "\n -xxx \t bevorzugt den anderen Generator verwenden.\n"
			<< "\n OPTION: "
			<< "\n -s xxxx \t weißt prngd an die Eingabe xxxx zur Generierung des Seeds zu verwenden."
			<< "\n -o dateiname \t speichert die generierten Zufallsbits in der angegeben Datei."
			<< "\n -i xxx \t Aktiviert Interface xxx, wobei xxx = tcp, udp, uds, mq order local sein kann."
			<< "\n --help \t zeigt diese Hilfe an.\n\n";


		}
	}
	return code;

}

void Prngd_Server::start(int argc, char** argv)
{
	int code = 0;

	code = readParameters(argc, argv);


	//bits untersuchen und je nachdem die Com_Server aktivieren bzw localserver-init()
	if((LOCAL_CODE & code) == LOCAL_CODE )
		localserver = new Prngd(LOCAL_ST);
	if((TCP_CODE & code) == TCP_CODE)
	{
		tcpserver = new Tcp_Server(TCP_ST);
		tcp_up = true;
	}
	if((UDP_CODE & code) == UDP_CODE)
	{
		udpserver = new Udp_Server(UDP_ST);
		udp_up = true;
	}
	if((UDOMAIN_CODE & code) == UDOMAIN_CODE)
	{
		udsserver = new Uds_Server(DM_ST);
		uds_up = true;
	}
	if((MQ_CODE & code) == MQ_CODE)
	{
		mqserver = new MQ_Server(MQ_ST);
		mq_up = true;
	}
	if(localserver != NULL)
		localserver->work(argc, argv);

	while(isAInterfaceUp())
	{
		sleep(1);
		checkAllInterfaces();
	}
	std::cout << "\n Alle Schnittstellen beendet, beende Programm.";

}



int main(int argc, char** argv)

{
	Prngd_Server* prngdserver = new Prngd_Server();

	prngdserver->start(argc, argv);

	return 0;
}
